home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / system-config-printer / troubleshoot / __init__.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-10-12  |  10.9 KB  |  387 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import gtk
  5. import pprint
  6. import sys
  7. import traceback
  8. if __name__ == '__main__':
  9.     import os.path as os
  10.     import gettext
  11.     gettext.textdomain('system-config-printer')
  12.     if sys.argv[0][0] != '/':
  13.         cwd = os.getcwd()
  14.         path = cwd + os.path.sep + sys.argv[0]
  15.     else:
  16.         path = sys.argv[0]
  17.     sub = os.path.dirname(path)
  18.     root = os.path.dirname(sub)
  19.     sys.path.append(root)
  20.  
  21. import base
  22. from base import *
  23.  
  24. class Troubleshooter:
  25.     
  26.     def __init__(self, quitfn = None, parent = None):
  27.         self._in_module_call = False
  28.         main = gtk.Window()
  29.         if parent:
  30.             main.set_transient_for(parent)
  31.             main.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
  32.             main.set_modal(True)
  33.         
  34.         main.set_title(_('Printing troubleshooter'))
  35.         main.set_property('default-width', 400)
  36.         main.set_property('default-height', 350)
  37.         main.connect('delete_event', self.quit)
  38.         self.main = main
  39.         self.quitfn = quitfn
  40.         vbox = gtk.VBox()
  41.         main.add(vbox)
  42.         ntbk = gtk.Notebook()
  43.         ntbk.set_border_width(6)
  44.         vbox.pack_start(ntbk, True, True, 0)
  45.         vbox.pack_start(gtk.HSeparator(), False, False, 0)
  46.         box = gtk.HButtonBox()
  47.         box.set_border_width(6)
  48.         box.set_spacing(3)
  49.         box.set_layout(gtk.BUTTONBOX_END)
  50.         back = gtk.Button(stock = 'gtk-go-back')
  51.         back.connect('clicked', self._on_back_clicked)
  52.         back.set_sensitive(False)
  53.         self.back = back
  54.         close = gtk.Button(stock = 'gtk-close')
  55.         close.connect('clicked', self.quit)
  56.         self.close = close
  57.         cancel = gtk.Button(stock = 'gtk-cancel')
  58.         cancel.connect('clicked', self.quit)
  59.         self.cancel = cancel
  60.         forward = gtk.Button(stock = 'gtk-go-forward')
  61.         forward.connect('clicked', self._on_forward_clicked)
  62.         forward.set_flags(gtk.CAN_DEFAULT | gtk.HAS_DEFAULT)
  63.         self.forward = forward
  64.         box.pack_start(back, False, False, 0)
  65.         box.pack_start(cancel, False, False, 0)
  66.         box.pack_start(close, False, False, 0)
  67.         box.pack_start(forward, False, False, 0)
  68.         vbox.pack_start(box, False, False, 0)
  69.         ntbk.set_current_page(0)
  70.         ntbk.set_show_tabs(False)
  71.         self.ntbk = ntbk
  72.         self.current_page = 0
  73.         self.questions = []
  74.         self.question_answers = []
  75.         self.answers = { }
  76.         self.moving_backwards = False
  77.         main.show_all()
  78.  
  79.     
  80.     def quit(self, *args):
  81.         if self._in_module_call:
  82.             
  83.             try:
  84.                 self.questions[self.current_page].cancel_operation()
  85.             except:
  86.                 self._report_traceback()
  87.  
  88.             return None
  89.         
  90.         try:
  91.             self.questions[self.current_page].disconnect_signals()
  92.         except:
  93.             self._in_module_call
  94.             self._report_traceback()
  95.  
  96.         for i in xrange(len(self.questions)):
  97.             self.questions.pop()
  98.         
  99.         self.main.hide()
  100.         if self.quitfn:
  101.             self.quitfn(self)
  102.         
  103.  
  104.     
  105.     def get_window(self):
  106.         return self.main
  107.  
  108.     
  109.     def no_more_questions(self, question):
  110.         page = self.questions.index(question)
  111.         debugprint('Page %d: No more questions.' % page)
  112.         self.questions = self.questions[:page + 1]
  113.         self.question_answers = self.question_answers[:page + 1]
  114.         for p in range(self.ntbk.get_n_pages() - 1, page, -1):
  115.             self.ntbk.remove_page(p)
  116.         
  117.         self._set_back_forward_buttons()
  118.  
  119.     
  120.     def new_page(self, widget, question):
  121.         page = len(self.questions)
  122.         debugprint('Page %d: new: %s' % (page, str(question)))
  123.         self.questions.append(question)
  124.         self.question_answers.append([])
  125.         self.ntbk.insert_page(widget, position = page)
  126.         widget.show_all()
  127.         if page == 0:
  128.             
  129.             try:
  130.                 question.connect_signals(self._set_back_forward_buttons)
  131.             except:
  132.                 self._report_traceback()
  133.  
  134.             self.ntbk.set_current_page(page)
  135.             self.current_page = page
  136.         
  137.         self._set_back_forward_buttons()
  138.         return page
  139.  
  140.     
  141.     def is_moving_backwards(self):
  142.         return self.moving_backwards
  143.  
  144.     
  145.     def answers_as_text(self):
  146.         text = ''
  147.         n = 1
  148.         for i in range(self.current_page):
  149.             answers = self.question_answers[i].copy()
  150.             for hidden in filter((lambda x: x.startswith('_')), answers.keys()):
  151.                 del answers[hidden]
  152.             
  153.             if len(answers.keys()) == 0:
  154.                 continue
  155.             
  156.             text += 'Page %d (%s):' % (n, self.questions[i]) + '\n'
  157.             text += pprint.pformat(answers) + '\n'
  158.             n += 1
  159.         
  160.         return text.rstrip() + '\n'
  161.  
  162.     
  163.     def busy(self):
  164.         self.forward.set_sensitive(False)
  165.         self.back.set_sensitive(False)
  166.         gdkwin = self.get_window().window
  167.         if gdkwin:
  168.             gdkwin.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
  169.             while gtk.events_pending():
  170.                 gtk.main_iteration()
  171.         
  172.  
  173.     
  174.     def ready(self):
  175.         gdkwin = self.get_window().window
  176.         if gdkwin:
  177.             gdkwin.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
  178.         
  179.         self._set_back_forward_buttons()
  180.  
  181.     
  182.     def _set_back_forward_buttons(self, *args):
  183.         page = self.current_page
  184.         self.back.set_sensitive(page != 0)
  185.         if len(self.questions) == page + 1:
  186.             debugprint('Out of questions')
  187.             self.forward.set_sensitive(False)
  188.             self.close.show()
  189.             self.cancel.hide()
  190.         else:
  191.             can = self._can_click_forward(self.questions[page])
  192.             debugprint('Page %d: can click forward? %s' % (page, can))
  193.             self.forward.set_sensitive(can)
  194.             self.close.hide()
  195.             self.cancel.show()
  196.  
  197.     
  198.     def _on_back_clicked(self, widget):
  199.         self.busy()
  200.         self.moving_backwards = True
  201.         
  202.         try:
  203.             self.questions[self.current_page].disconnect_signals()
  204.         except:
  205.             self._report_traceback()
  206.  
  207.         self.current_page -= 1
  208.         question = self.questions[self.current_page]
  209.         while not self._display(question):
  210.             debugprint('Page %d: skip' % self.current_page)
  211.             self.current_page -= 1
  212.             question = self.questions[self.current_page]
  213.             continue
  214.             self
  215.         self.ntbk.set_current_page(self.current_page)
  216.         answers = { }
  217.         for i in range(self.current_page):
  218.             answers.update(self.question_answers[i])
  219.         
  220.         self.answers = answers
  221.         
  222.         try:
  223.             self.questions[self.current_page].connect_signals(self._set_back_forward_buttons)
  224.         except:
  225.             self
  226.             self._report_traceback()
  227.  
  228.         self.moving_backwards = False
  229.         self.ready()
  230.  
  231.     
  232.     def _on_forward_clicked(self, widget):
  233.         self.busy()
  234.         answer_dict = self._collect_answer(self.questions[self.current_page])
  235.         self.question_answers[self.current_page] = answer_dict
  236.         self.answers.update(answer_dict)
  237.         
  238.         try:
  239.             self.questions[self.current_page].disconnect_signals()
  240.         except:
  241.             self._report_traceback()
  242.  
  243.         self.current_page += 1
  244.         question = self.questions[self.current_page]
  245.         while not self._display(question):
  246.             answer_dict = self._collect_answer(question)
  247.             self.question_answers[self.current_page] = answer_dict
  248.             self.answers.update(answer_dict)
  249.             debugprint('Page %d: skip' % self.current_page)
  250.             self.current_page += 1
  251.             question = self.questions[self.current_page]
  252.             continue
  253.             self
  254.         self.ntbk.set_current_page(self.current_page)
  255.         
  256.         try:
  257.             question.connect_signals(self._set_back_forward_buttons)
  258.         except:
  259.             self
  260.             self._report_traceback()
  261.  
  262.         self.ready()
  263.         if get_debugging():
  264.             self._dump_answers()
  265.         
  266.  
  267.     
  268.     def _dump_answers(self):
  269.         debugprint(self.answers_as_text())
  270.  
  271.     
  272.     def _report_traceback(self):
  273.         print 'Traceback:'
  274.         (type, value, tb) = sys.exc_info()
  275.         tblast = traceback.extract_tb(tb, limit = None)
  276.         if len(tblast):
  277.             tblast = tblast[:len(tblast) - 1]
  278.         
  279.         extxt = traceback.format_exception_only(type, value)
  280.         for line in traceback.format_tb(tb):
  281.             print line.strip()
  282.         
  283.         print extxt[0].strip()
  284.  
  285.     
  286.     def _display(self, question):
  287.         result = False
  288.         self._in_module_call = True
  289.         
  290.         try:
  291.             result = question.display()
  292.         except:
  293.             self._report_traceback()
  294.  
  295.         self._in_module_call = False
  296.         question.displayed = result
  297.         return result
  298.  
  299.     
  300.     def _can_click_forward(self, question):
  301.         
  302.         try:
  303.             return question.can_click_forward()
  304.         except:
  305.             self._report_traceback()
  306.             return True
  307.  
  308.  
  309.     
  310.     def _collect_answer(self, question):
  311.         answer = { }
  312.         self._in_module_call = True
  313.         
  314.         try:
  315.             answer = question.collect_answer()
  316.         except:
  317.             self._report_traceback()
  318.  
  319.         self._in_module_call = False
  320.         return answer
  321.  
  322.  
  323. QUESTIONS = [
  324.     'Welcome',
  325.     'SchedulerNotRunning',
  326.     'CheckLocalServerPublishing',
  327.     'ChoosePrinter',
  328.     'CheckPrinterSanity',
  329.     'CheckPPDSanity',
  330.     'LocalOrRemote',
  331.     'DeviceListed',
  332.     'CheckUSBPermissions',
  333.     'RemoteAddress',
  334.     'CheckNetworkServerSanity',
  335.     'ChooseNetworkPrinter',
  336.     'NetworkCUPSPrinterShared',
  337.     'QueueNotEnabled',
  338.     'QueueRejectingJobs',
  339.     'PrinterStateReasons',
  340.     'ServerFirewalled',
  341.     'ErrorLogCheckpoint',
  342.     'PrintTestPage',
  343.     'ErrorLogFetch',
  344.     'PrinterStateReasons',
  345.     'ErrorLogParse',
  346.     'Locale',
  347.     'Shrug']
  348.  
  349. def run(quitfn = None, parent = None):
  350.     troubleshooter = Troubleshooter(quitfn, parent = parent)
  351.     modules_imported = []
  352.     for module in QUESTIONS:
  353.         
  354.         try:
  355.             if module not in modules_imported:
  356.                 exec 'from %s import %s' % (module, module)
  357.                 modules_imported.append(module)
  358.             
  359.             exec '%s (troubleshooter)' % module
  360.         continue
  361.         troubleshooter._report_traceback()
  362.         continue
  363.  
  364.     
  365.     return troubleshooter
  366.  
  367. if __name__ == '__main__':
  368.     import sys
  369.     import getopt
  370.     
  371.     try:
  372.         (opts, args) = getopt.gnu_getopt(sys.argv[1:], '', [
  373.             'debug'])
  374.         for opt, optarg in opts:
  375.             if opt == '--debug':
  376.                 set_debugging(True)
  377.             
  378.     except getopt.GetoptError:
  379.         pass
  380.  
  381.     gtk.gdk.threads_init()
  382.     run(gtk.main_quit)
  383.     gtk.gdk.threads_enter()
  384.     gtk.main()
  385.     gtk.gdk.threads_leave()
  386.  
  387.